02 您所在的位置:网站首页 内存屏障 作用 02

02

2023-07-04 21:04| 来源: 网络整理| 查看: 265

RCU机制

因为rcu主要存在场景为链表 红黑树又和进程调度强相关所以要讲rcu RCU记录所有指向共享数据的指针的使用者,当要修改该共享数据时,首先创建一个副本, 在副本中修改。所有读访问线程都离开读临界区之后,指针指向新的修改后副本的指针,并且 删除旧数据。 RCU优势是读线程没有任何同步开销:不需要获取任何的锁,不需要执行原子指令,不需要执行内存屏障。但是写者的同步开销比较大,写 线程需要延迟对象的释放、复制被修改的对象,写者之间必须使用锁互斥操作方法。

LINUX源码中对链表的操作

读拷贝更新(RCU)模式添加链表项,

static inline void list_ add_ rcu(struct list_ head *new, struct list_ head *head) list_ add_ rcu (new, head, head->next) ; }

将新的链表元素new添加到表头为head的链表头部, 而list_ add tail_ rcut将其添加到链表尾部。

static inline void list_ del_ rcu(struct list_ head *entry) { list_ del_ entry (entry) ; . entry->prev = LIST_ POISON2 ; . }

将链表元素old替换为new.

static inline void list_ replace_ rcu(struct list_ head *old, struct list head *new) { new->next = old->next; new- >prev = old->prev; rcu_ assign pointer (list_ next_ rcu (new- >prev),new) ; new- >next- >prev = new; old- >prev = LIST_ POISON2 ; } 内存屏障

优化屏障 1、编译器优化:提高系统的性能,编译器在不影响逻辑的情况下会调整指令的顺序。 2、CPU执行优化:提高流水线的性能,CPU的乱序执行可能会让后面的没有寄存器冲突和汇编指令先于 前面的指令完成。

/* The "volatile" is due to gcc bugs */ #define barrier () asm volatile ("": : : "memory" ) //_asm_表示插入汇编语言程序;_ volatile_ 表示阻止编译对该值进行优化,确保变量使用了用 //户定义的精确地址,而不是装有同一信息的一些别名。memory表示修改了内存单元。 //个人感觉使用下面的就可以了 #define preempt disable() \ do{\ preempt_ count inc(); \ barrier() ;\ }whilee)

还没写完 直接搜内存屏障吧



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有